#ifndef PLUGINMANAGER_H
#define PLUGINMANAGER_H

#include <QObject>
#include <QList>
#include <QDir>
#include <QPluginLoader>
#include "CameraPluginInterface.h"

class PluginManager : public QObject {
    Q_OBJECT
public:
    explicit PluginManager(QObject *parent = nullptr);
    ~PluginManager();

    /**
     * @brief 加载指定目录下的所有相机插件
     * @param pluginsDir 插件目录的绝对路径
     */
    void loadPlugins(const QString &pluginsDir);

    /**
     * @brief 通过反射机制调用指定插件的函数
     * @param pluginName 目标插件名称
     * @param funcName 目标函数名称（需为Q_INVOKABLE或槽函数）
     * @param args 参数列表（QVariant类型）
     * @param retVal 存储返回值的QVariant引用
     * @return 调用成功返回true，失败返回false
     */
    bool callPluginFunction(const QString& pluginName, const QString& funcName, const QVariantList& args, QVariant& retVal);

    /**
     * @brief 获取已加载的插件列表
     * @return 插件实例列表
     */
    QList<CameraPluginInterface*> loadedPlugins() const { return m_loadedPlugins; }

signals:
    /**
     * @brief 插件消息转发信号（连接到主界面消息处理槽）
     * @param sender 消息发送者插件名称
     * @param message 消息内容
     */
    void pluginMessageForwarded(const QString& sender, const QString& message);
    // 插件加载完成信号
    void pluginLoaded(CameraPluginInterface* plugin);
private slots:
    void onPluginMessageReceived(const QString& sender, const QString& message, const QString& targetPluginName);
    bool onRequestPluginFunctionCall(const QString& targetPluginName, const QString& functionName, const QVariantList& args, QVariant& returnValue);

private:
    QList<CameraPluginInterface*> m_loadedPlugins; ///< 已加载的插件实例列表
};

#endif // PLUGINMANAGER_H